//package com.example.wechat.login.controller;
//
//import com.example.wechat.login.config.SpeechHistoryConfig;
//import com.example.wechat.login.dto.ApiResponse;
//import com.example.wechat.login.dto.speech.SpeechRecognitionResponse;
//import com.example.wechat.login.entity.SpeechRecognitionHistory;
//import com.example.wechat.login.service.SpeechRecognitionHistoryService;
//import com.example.wechat.login.vo.HistoryStatisticsVO;
//import lombok.RequiredArgsConstructor;
//import lombok.extern.slf4j.Slf4j;
//import org.springframework.core.io.Resource;
//import org.springframework.core.io.UrlResource;
//import org.springframework.data.domain.Page;
//import org.springframework.data.domain.PageRequest;
//import org.springframework.data.domain.Pageable;
//import org.springframework.data.domain.Sort;
//import org.springframework.format.annotation.DateTimeFormat;
//import org.springframework.http.HttpHeaders;
//import org.springframework.http.HttpStatus;
//import org.springframework.http.MediaType;
//import org.springframework.http.ResponseEntity;
//import org.springframework.web.bind.annotation.*;
//import org.springframework.web.multipart.MultipartFile;
//
//import java.io.IOException;
//import java.net.MalformedURLException;
//import java.nio.file.Path;
//import java.nio.file.Paths;
//import java.time.LocalDateTime;
//import java.util.HashMap;
//import java.util.List;
//import java.util.Map;
//import java.util.UUID;
//
///**
// * 语音识别历史记录控制器
// */
//@Slf4j
//@RestController
//@RequestMapping("/api/speech/history")
//@RequiredArgsConstructor
//public class SpeechRecognitionHistoryController {
//
//    private final SpeechRecognitionHistoryService historyService;
//    private final SpeechHistoryConfig historyConfig;
//
//    /**
//     * 分页查询用户的历史记录
//     *
//     * @param openid 用户openid
//     * @param page 页码（从0开始）
//     * @param size 每页大小
//     * @param sort 排序字段
//     * @param direction 排序方向（asc或desc）
//     * @return 分页历史记录
//     */
//    @GetMapping
//    public ApiResponse<Page<SpeechRecognitionHistory>> getHistoryByPage(
//            @RequestParam String openid,
//            @RequestParam(defaultValue = "0") int page,
//            @RequestParam(defaultValue = "10") int size,
//            @RequestParam(defaultValue = "createTime") String sort,
//            @RequestParam(defaultValue = "desc") String direction) {
//
//        Sort.Direction sortDirection = "asc".equalsIgnoreCase(direction) ? Sort.Direction.ASC : Sort.Direction.DESC;
//        Pageable pageable = PageRequest.of(page, size, Sort.by(sortDirection, sort));
//
//        Page<SpeechRecognitionHistory> historyPage = historyService.findByOpenid(openid, pageable);
//        return ApiResponse.success(historyPage);
//    }
//
//    /**
//     * 根据ID获取单条历史记录
//     *
//     * @param id 历史记录ID
//     * @return 历史记录
//     */
//    @GetMapping("/{id}")
//    public ApiResponse<SpeechRecognitionHistory> getHistoryById(@PathVariable Long id) {
//        SpeechRecognitionHistory history = historyService.findById(id);
//        if (history == null) {
//            return ApiResponse.error(HttpStatus.NOT_FOUND.value(), "历史记录不存在");
//        }
//        return ApiResponse.success(history);
//    }
//
//    /**
//     * 根据时间范围查询历史记录
//     *
//     * @param openid 用户openid
//     * @param startTime 开始时间
//     * @param endTime 结束时间
//     * @return 历史记录列表
//     */
//    @GetMapping("/time-range")
//    public ApiResponse<List<SpeechRecognitionHistory>> getHistoryByTimeRange(
//            @RequestParam String openid,
//            @RequestParam @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) LocalDateTime startTime,
//            @RequestParam @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) LocalDateTime endTime) {
//
//        List<SpeechRecognitionHistory> historyList = historyService.findByOpenidAndTimeRange(openid, startTime, endTime);
//        return ApiResponse.success(historyList);
//    }
//
//    /**
//     * 根据音频格式查询历史记录
//     *
//     * @param openid 用户openid
//     * @param audioFormat 音频格式
//     * @return 历史记录列表
//     */
//    @GetMapping("/audio-format/{audioFormat}")
//    public ApiResponse<List<SpeechRecognitionHistory>> getHistoryByAudioFormat(
//            @RequestParam String openid,
//            @PathVariable String audioFormat) {
//
//        List<SpeechRecognitionHistory> historyList = historyService.findByOpenidAndAudioFormat(openid, audioFormat);
//        return ApiResponse.success(historyList);
//    }
//
//    /**
//     * 根据引擎类型查询历史记录
//     *
//     * @param openid 用户openid
//     * @param engineType 引擎类型
//     * @return 历史记录列表
//     */
//    @GetMapping("/engine-type/{engineType}")
//    public ApiResponse<List<SpeechRecognitionHistory>> getHistoryByEngineType(
//            @RequestParam String openid,
//            @PathVariable String engineType) {
//
//        List<SpeechRecognitionHistory> historyList = historyService.findByOpenidAndEngineType(openid, engineType);
//        return ApiResponse.success(historyList);
//    }
//
//    /**
//     * 删除单条历史记录
//     *
//     * @param id 历史记录ID
//     * @return 操作结果
//     */
//    @DeleteMapping("/{id}")
//    public ApiResponse<Void> deleteHistory(@PathVariable Long id) {
//        historyService.deleteById(id);
//        return ApiResponse.success();
//    }
//
//    /**
//     * 删除用户的所有历史记录
//     *
//     * @param openid 用户openid
//     * @return 操作结果
//     */
//    @DeleteMapping("/user")
//    public ApiResponse<Void> deleteAllUserHistory(@RequestParam String openid) {
//        historyService.deleteByOpenid(openid);
//        return ApiResponse.success();
//    }
//
//    /**
//     * 删除指定时间范围内的历史记录
//     *
//     * @param openid 用户openid
//     * @param startTime 开始时间
//     * @param endTime 结束时间
//     * @return 操作结果
//     */
//    @DeleteMapping("/time-range")
//    public ApiResponse<Void> deleteHistoryByTimeRange(
//            @RequestParam String openid,
//            @RequestParam @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) LocalDateTime startTime,
//            @RequestParam @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) LocalDateTime endTime) {
//
//        historyService.deleteByOpenidAndTimeRange(openid, startTime, endTime);
//        return ApiResponse.success();
//    }
//
//    /**
//     * 获取用户历史记录统计信息
//     *
//     * @param openid 用户openid
//     * @return 统计信息
//     */
//    @GetMapping("/statistics")
//    public ApiResponse<HistoryStatisticsVO> getHistoryStatistics(@RequestParam String openid) {
//        List<SpeechRecognitionHistory> historyList = historyService.findByOpenid(openid);
//
//        // 计算统计信息
//        HistoryStatisticsVO statistics = new HistoryStatisticsVO();
//        statistics.setTotalCount(historyList.size());
//
//        // 计算总音频大小
//        long totalSize = historyList.stream()
//                .filter(h -> h.getAudioFileSize() != null)
//                .mapToLong(SpeechRecognitionHistory::getAudioFileSize)
//                .sum();
//        statistics.setTotalAudioSize(totalSize);
//
//        // 计算各种音频格式的数量
//        Map<String, Integer> formatCounts = new HashMap<>();
//        historyList.stream()
//                .filter(h -> h.getAudioFormat() != null)
//                .forEach(h -> formatCounts.merge(h.getAudioFormat(), 1, Integer::sum));
//        statistics.setAudioFormatCounts(formatCounts);
//
//        // 计算各种引擎类型的数量
//        Map<String, Integer> engineCounts = new HashMap<>();
//        historyList.stream()
//                .filter(h -> h.getEngineType() != null)
//                .forEach(h -> engineCounts.merge(h.getEngineType(), 1, Integer::sum));
//        statistics.setEngineTypeCounts(engineCounts);
//
//        // 设置配置信息
//        statistics.setMaxUserHistoryCount(historyConfig.getMaxUserHistoryCount());
//        statistics.setHistoryRetentionDays(historyConfig.getHistoryRetentionDays());
//
//        return ApiResponse.success(statistics);
//    }
//
//    /**
//     * 上传音频文件并保存历史记录
//     *
//     * @param openid 用户openid
//     * @param file 音频文件
//     * @param engineType 引擎类型
//     * @param audioFormat 音频格式
//     * @return 保存的历史记录
//     */
//    @PostMapping("/upload")
//    public ApiResponse<SpeechRecognitionHistory> uploadAudioAndSaveHistory(
//            @RequestParam String openid,
//            @RequestParam MultipartFile file,
//            @RequestParam String engineType,
//            @RequestParam String audioFormat) {
//
//        try {
//            // 检查用户历史记录数量是否超过限制
//            long userHistoryCount = historyService.countByOpenid(openid);
//            if (userHistoryCount >= historyConfig.getMaxUserHistoryCount()) {
//                return ApiResponse.error(HttpStatus.BAD_REQUEST.value(),
//                        "历史记录数量已达到上限: " + historyConfig.getMaxUserHistoryCount());
//            }
//
//            // 生成唯一文件名
//            String originalFilename = file.getOriginalFilename();
//            String fileExtension = originalFilename != null && originalFilename.contains(".")
//                    ? originalFilename.substring(originalFilename.lastIndexOf("."))
//                    : "";
//            String filename = UUID.randomUUID().toString() + fileExtension;
//
//            // 保存音频文件
//            String audioFilePath = historyService.saveAudioFile(file, filename);
//
//            // 创建历史记录
//            SpeechRecognitionHistory history = new SpeechRecognitionHistory();
//            history.setOpenid(openid);
//            history.setEngineType(engineType);
//            history.setAudioFormat(audioFormat);
//            history.setAudioFileName(filename);
//            history.setAudioFilePath(audioFilePath);
//            history.setAudioFileSize(file.getSize());
//            history.setCreateTime(LocalDateTime.now());
//
//            // 保存历史记录
//            SpeechRecognitionHistory savedHistory = historyService.save(history);
//
//            return ApiResponse.success(savedHistory);
//        } catch (IOException e) {
//            log.error("上传音频文件失败", e);
//            return ApiResponse.error(HttpStatus.INTERNAL_SERVER_ERROR.value(), "上传音频文件失败: " + e.getMessage());
//        }
//    }
//
//    /**
//     * 上传音频文件、进行识别并保存历史记录
//     *
//     * @param openid 用户openid
//     * @param file 音频文件
//     * @param engineType 引擎类型
//     * @return 识别结果和保存的历史记录
//     */
//    @PostMapping("/recognize-and-save")
//    public ApiResponse<Map<String, Object>> recognizeAndSaveHistory(
//            @RequestParam String openid,
//            @RequestParam MultipartFile file,
//            @RequestParam String engineType) {
//
//        try {
//            // 检查用户历史记录数量是否超过限制
//            long userHistoryCount = historyService.countByOpenid(openid);
//            if (userHistoryCount >= historyConfig.getMaxUserHistoryCount()) {
//                return ApiResponse.error(HttpStatus.BAD_REQUEST.value(),
//                        "历史记录数量已达到上限: " + historyConfig.getMaxUserHistoryCount());
//            }
//
//            // 生成唯一文件名
//            String originalFilename = file.getOriginalFilename();
//            String fileExtension = originalFilename != null && originalFilename.contains(".")
//                    ? originalFilename.substring(originalFilename.lastIndexOf("."))
//                    : "";
//            String filename = UUID.randomUUID().toString() + fileExtension;
//
//            // 保存音频文件
//            String audioFilePath = historyService.saveAudioFile(file, filename);
//
//            // 进行语音识别
//            SpeechRecognitionResponse recognitionResult = historyService.recognizeAudio(file, engineType);
//
//            // 创建历史记录
//            SpeechRecognitionHistory history = new SpeechRecognitionHistory();
//            history.setOpenid(openid);
//            history.setEngineType(engineType);
//            history.setAudioFormat(fileExtension.replace(".", ""));
//            history.setAudioFileName(filename);
//            history.setAudioFilePath(audioFilePath);
//            history.setAudioFileSize(file.getSize());
//            history.setCreateTime(LocalDateTime.now());
//            history.setRecognitionResult(recognitionResult.getResult());
//            history.setAudioDuration((int)(recognitionResult.getAudioTime() / 1000)); // 转换毫秒为秒
//
//            // 保存历史记录
//            SpeechRecognitionHistory savedHistory = historyService.save(history);
//
//            // 构建响应
//            Map<String, Object> responseData = new HashMap<>();
//            responseData.put("history", savedHistory);
//            responseData.put("recognitionResult", recognitionResult);
//
//            return ApiResponse.success(responseData);
//        } catch (IOException e) {
//            log.error("处理音频文件失败", e);
//            return ApiResponse.error(HttpStatus.INTERNAL_SERVER_ERROR.value(), "处理音频文件失败: " + e.getMessage());
//        }
//    }
//
//    /**
//     * 获取音频文件
//     *
//     * @param id 历史记录ID
//     * @return 音频文件
//     */
//    @GetMapping("/{id}/audio")
//    public ResponseEntity<Resource> getAudioFile(@PathVariable Long id) {
//        SpeechRecognitionHistory history = historyService.findById(id);
//        if (history == null || history.getAudioFilePath() == null) {
//            return ResponseEntity.notFound().build();
//        }
//
//        try {
//            Path filePath = Paths.get(history.getAudioFilePath());
//            Resource resource = new UrlResource(filePath.toUri());
//
//            if (resource.exists() && resource.isReadable()) {
//                String contentType = determineContentType(history.getAudioFormat());
//
//                return ResponseEntity.ok()
//                        .contentType(MediaType.parseMediaType(contentType))
//                        .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + history.getAudioFileName() + "\"")
//                        .body(resource);
//            } else {
//                return ResponseEntity.notFound().build();
//            }
//        } catch (MalformedURLException e) {
//            log.error("获取音频文件失败", e);
//            return ResponseEntity.notFound().build();
//        }
//    }
//
//    /**
//     * 根据音频格式确定内容类型
//     *
//     * @param audioFormat 音频格式
//     * @return 内容类型
//     */
//    private String determineContentType(String audioFormat) {
//        if (audioFormat == null) {
//            return "application/octet-stream";
//        }
//
//        switch (audioFormat.toLowerCase()) {
//            case "mp3":
//                return "audio/mpeg";
//            case "wav":
//                return "audio/wav";
//            case "ogg":
//                return "audio/ogg";
//            case "flac":
//                return "audio/flac";
//            case "aac":
//                return "audio/aac";
//            case "m4a":
//                return "audio/mp4";
//            default:
//                return "application/octet-stream";
//        }
//    }
//}